package 树.递归;

/*
解题思路：
   这题还是在  求子树最大深度的基础上改造。求出来每个节点的左子树最大深度
    和右子树最大深度后，把这两个深度加起来 就是“两个结点路径长度中的最大值”。
    这样再定义一个成员变量max来保存最大的那个路径长度。
    在每一次把每一个节点的左右子树的两个最大深度加起来后都把max和这个最大深度和进行比较，取大的值作为max。
    让max始终维护 节点路径长度最大，最后返回max即可
*/
public class 二叉树的直径_543 {
    int max = 0;

    public int diameterOfBinaryTree(TreeNode root) {
        MaxDepth(root);
        return max;

    }

    public int MaxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }

        int left = MaxDepth(root.left);
        int right = MaxDepth(root.right);
        max = Math.max(left + right, max);//将每个节点最大直径(左子树深度+右子树深度)和当前最大值比较并取大者。也就是max始终只保留最长的路径

        return Math.max(left, right) + 1;
    }
}
